#pragma once

#include <iostream>
#include <vector>
#include <string>
#include <ctemplate/template.h>


#include "oj_model_mysql.hpp"
namespace ns_view
{
    using namespace ns_model_mysql;
    using std::string;
    using std::vector;

    const string template_html_path("./template_html/");

    class View
    {
    public:
        /**
         * @brief 渲染题目列表网页
         *
         * @param[in] questions 所有题目信息
         *
         * @param[out] html_content 存放渲染后网页内容
         *
         */
        static void expand_questions_list_html(const vector<Question>& questions,string* html_content)
        {
            /* 设置题目列表模版网页路径 */
            string src_html = template_html_path + "questions_list.html";

            /* 1. 创建字典 */
            ctemplate::TemplateDictionary root("questions_list");

            /* 2. 向字典中添加key:value */
            for(const auto& e : questions)
            {
                ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("one_question");
                sub->SetValue("number",e.number);
                sub->SetValue("title",e.title);
                sub->SetValue("star",e.star);
            }

            /* 3. 获取模版对象（被渲染对象） */
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            /* 4. 替换（渲染）对象，并将渲染结果写入target_html */
            tpl->Expand(html_content,&root);
        }

        /**
         * @brief 渲染题目网页
         *
         * @param[in] question 题目信息
         *
         * @param[out] html_content 存放渲染后网页内容
         *
         */
        static void expand_question_html(const Question& question,string* html_content)
        {
            /* 设置题目列表模版网页路径 */
            string src_html = template_html_path + "question.html";
            /* 1. 创建字典 */
            ctemplate::TemplateDictionary root("question");

            /* 2. 向字典中添加key:value */
            root.SetValue("number",question.number);
            root.SetValue("title",question.title);
            root.SetValue("star",question.star);
            root.SetValue("desc",question.desc);
            root.SetValue("basic_code",question.basic_code);

            /* 3. 获取模版对象（被渲染对象） */
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            /* 4. 替换（渲染）对象，并将渲染结果写入target_html */
            tpl->Expand(html_content,&root);
        }
    };
}